В предыдущей статье мы говорили об одном из методов Transfer Learning — выделении признаков. Сегодня продолжим разговор о трансферном обучении и затронем ещё один метод использования предварительно обученных архитектур — Fine Tuning (дообучение). Читайте далее, как замораживать и размораживать блоки моделей TensorFlow, а также как повысить точность модели, дообучив последние слои для решения задачи распознавания образов.
Fine Tuning что это
В отличие от feature extraction, суть дообучения (Fine Tuning) заключается в размораживании последних слоев нейронной сети (Neural Net) и их обучении. Таким образом, корректируются слои, которые имеют наиболее абстрактные представления. Производя дообучение только нескольких слоев, мы уменьшаем риск переобучения (overfitting). И самое главное, это позволяет сделать текущую модель ещё более подходящей к нашей задаче.
Если верхние слои следует дообучить, то полносвязные слои нужно заменить на свои и тоже обучить. Процедура Fine tuning состоит в следующем:
- Заморозить все слои предварительно обученной модели.
- Добавить свои слои к обученной модели.
- Обучить добавленные слои.
- Разморозить несколько верхних слоев.
- Обучить эти слои и добавленную часть вместе.
Первые 3 шага обсуждались в прошлой раз, когда к замороженной сверточной основе поверх добавили свой полносвязный классификатор. Пример на Python для создания и обучения своего полносвязного классификатора TensorFlow выглядит так:
conv_base.trainable = False model = models.Sequential([ conv_base, layers.Flatten(), layers.Dense(256, activation='relu'), layers.Dense(1, activation='sigmoid') ]) model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=2e-5), metrics=['acc']) model.fit( train_generator, steps_per_epoch=100, epochs=30, validation_steps=50, validation_data=valid_generator)
Поскольку мы заморозили сверточную основу сети VGG16 в первой строчке, то её коэффициенты после обучения никак не изменились, в отличие от добавленных полносвязных слоев (Dense). Теперь нужно разморозить последние слои сверточной основы.
Размораживание заданных слоев
Вызовом метода conv_base.summary()
можно узнать название всех слоев, а также количество параметров. Мы разморозим только последний блок под номером 5, который содержит 3 сверточных слоя и слой Pooling. Пример кода на Python для замораживания все блоков сверточной основы архитектуры VGG16, кроме 5-го:
conv_base.trainable = True set_trainable = False for layer in conv_base.layers: if layer.name == 'block5_conv1': set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False
Обучение модели TensorFlow
Теперь можем приступить к 5-му шагу и обучить размороженный блок с полносвязным классификатором. Мы выбрали оптимизатор RMSProp с очень маленькой скоростью обучения (learning rate), чтобы ограничить размах изменений. Большие изменения повредят обученные локальные представления. Пример кода на Python для компиляция и обучения модели TensorFlow:
model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=2e-5), metrics=['acc']) log_dir = "logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S") tensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1) model.fit( train_generator, steps_per_epoch=100, epochs=30, validation_steps=50, validation_data=valid_generator, callbacks=[tensorboard_callback])
Также мы добавили в качестве обратного вызова инструмент визуализации TensorBoard. Инициализации TensorBoard в ipynb-блокноте или в Google Colab выглядит так:
%load_ext tensorboard %tensorboard --logdir logs
Таким образом, точность модели Machine Learning достигла 93% на валидационной выборке. Это лучше, чем использование только одного метода выделения признаков, обсуждаемого в прошлой статье.
О том, как применять Fine tuninng на реальных моделях Machine Learning, а также как производить обучение моделей TensorFlow, вы узнаете на нашем специализированном курсе «VISI: Computer Vision» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.